package com.sondon.dev_soceket.netty;

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.channel.group.ChannelGroup;
import io.netty.channel.group.DefaultChannelGroup;
import io.netty.util.concurrent.GlobalEventExecutor;

import com.sondon.dev_soceket.business.DevUploadBusiness;
import com.sondon.dev_soceket.business.ParConfBusiness;
import com.sondon.dev_soceket.business.QueryDevConfBusiness;
import com.sondon.dev_soceket.business.QueryVersionBusiness;
import com.sondon.dev_soceket.business.RegisterBusiness;
import com.sondon.dev_soceket.config.CMD;
import com.sondon.dev_soceket.model.Entity;
import com.sondon.dev_soceket.tcp.util.CodeUtil;

/**
 * @Project : Java_C_Socket_Maven
 * @Package : com.sondon.netty
 * @Class : DeviceTCPServerHandler.java
 * @Company 广州讯动网络科技有限公司
 * @Author : 蔡文锋
 * @DateTime：2015年4月15日 下午1:23:10
 * @Blog：http://blog.csdn.net/caiwenfeng_for_23
 * @Description : { 消息处理 }
 */
public class DeviceTCPServerHandler extends SimpleChannelInboundHandler<Entity> {
	/**
	 * ChannelGroup 保存channel
	 */
	static final ChannelGroup channels = new DefaultChannelGroup(
			GlobalEventExecutor.INSTANCE);

	/**
	 * 
	 * @Author 蔡文锋
	 * @Data_Time 2015年4月22日 下午5:32:08
	 * @Description {发送消息给所有设备}
	 * @param entity
	 */
	public static void SendMsgToALL(Entity entity) {
		channels.writeAndFlush(entity);
	}

	@Override
	public void messageReceived(ChannelHandlerContext ctx, Entity entity) {
		boolean is_send = true;
		Entity response = new Entity();
		String DATA = entity.getDATA();

		// System.out.println("FactorialServerHandler  Entity:"+entity);
		/*
		 * 返回Entity的实体，说明 CRC校验通过,下面进行业务逻辑编写根据不同CMD命令，执行不同的操作
		 */
		switch (CodeUtil.HexStringToInt(entity.getCMD())) {
		case CMD.Res_ParConfigure:// 参数配置（非广播方式）
			ParConfBusiness.DeCode(DATA);
			is_send = false;
			break;
		case CMD.Res_Query_Dev_Configure:// 查询设备配置（非广播方式）
			QueryDevConfBusiness.DeCode(DATA);
			is_send = false;
			break;
		case CMD.Req_Register:// 设备注册
			response = RegisterBusiness.DeCode(DATA);
			break;
		case CMD.Req_Dev_Upload:// 设备主动上传
			response = DevUploadBusiness.DeCode(DATA);
			break;
		case CMD.Req_Query_Version:// 查询版本
			QueryVersionBusiness.DeCode(DATA);
			is_send=false;
			break;
		case CMD.Req_Query_Down_Info:// 查询程序下载信息
			
			break;
		case CMD.Req_Down_File:// 程序下载
			
			break;
		default:
			System.out.println("default ----->entity  :\n" + entity.toString());
			break;
		}
		if (is_send) {
			// 返回响应Entity
			ctx.writeAndFlush(response);
		}
	}

	@Override
	public void channelActive(ChannelHandlerContext ctx) throws Exception {
		// A closed channel will be removed from ChannelGroup automatically
		channels.add(ctx.channel());
//		ChannelId cid = ctx.channel().id();
		// System.out.println("ChannelID  :"+cid.asLongText());
	}

	@Override
	public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause)
			throws Exception {
		cause.printStackTrace();
		ctx.close();
	}
}
